<?php

/**
 * Forum
 */
class Forum extends CI_Model
{
	const TABLE_FORUM					= 'forum';
	const ID_FORUM						= 'IDForum';
	const ID_ADC_FORUM					= 'IDAction';
	const TITRE_FORUM 					= 'TitreForum';
	const COMMENTAIRE_FORUM 			= 'CommF';
	const DATE_FORUM 					= 'DateF';
	const DATE_LIMITE_INSCRIPTION_FORUM	= 'DateLimiteF';
	const LIEU_FORUM					= 'Lieu';
	const NOM_LYCEE_FORUM				= 'NomLycee';
	const HEURE_DEBUT_FORUM				= 'HeureDeb';
	const HEURE_FIN_FORUM				= 'HeureFin';
	const NOTE_MAX_FORUM 				= 'NoteMaxF';
	const LOGIN_ENSEIGNANT_FORUM		= 'LoginE';
	const ID_ETUDIANT1_FORUM			= 'ETUDIANTID1';
	const ID_ETUDIANT2_FORUM			= 'ETUDIANTID2';
	const NOTE1_FORUM					= 'Note1';
	const NOTE2_FORUM					= 'Note2';
	const ETAT_FORUM					= 'CodeEtat';
	const LUNDI							= 'Lundi de l\\\'info';
	const LUNDI2						= 'Lundi de l\'info';
	
    /**
     * @var integer
     */
    private $id;
    
    /**
     * @var integer
     */
    private $action;

    /**
     * @var string
     */
    private $titre;

    /**
     * @var string
     */
    private $commentaire;

    /**
     * @var \DateTime
     */
    private $date;

    /**
     * @var \DateTime
     */
    private $dateLimiteInscription;

    /**
     * @var string
     */
    private $lieu;

    /**
     * @var string
     */
    private $nomLycee;

    /**
     * @var \DateTime
     */
    private $heureDebut;

    /**
     * @var \DateTime
     */
    private $heureFin;

    /**
     * @var integer
     */
    private $noteMax;
    
    /**
     * L'id de l'étudiant 1 associés au forum
     * @var int
     */
    private $etudiant1;
    
    /**
     * L'id de l'étudiant 2 associés au forum
     * @var int
     */
    private $etudiant2;
    
    /**
     * @var integer
     */
    private $noteEtu1;
    
    /**
     * @var integer
     */
    
    private $noteEtu2;
     /**
     * @var integer
     */
    private $etat;
    
    /**
     * @var string
     */
    private $enseignant;

    public function __construct()
    {
    	parent::__construct();
    	
    	$this->load->model('ActionsDeCommunication/ActionDeCommunication');
    }
    
    public function count($where = array())
    {
    	return (int) $this->db->where($where)
    					      ->count_all_results(Forum::TABLE_FORUM.' e');
    }
    
    public static function findAll($idAction, $where = null, $filtre = null)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    	
    	if($filtre != null)
    	{
    		switch($filtre)
    		{
    			case 'titre':
    				$filtre = self::TITRE_FORUM ;
    				break;
    			case 'nomLycee':
    				$filtre = self::NOM_LYCEE_FORUM;
    				break;
    			case 'lieu':
    				$filtre = self::LIEU_FORUM;
    				break;
    			case 'date':
    				$filtre = 'YEAR('.self::DATE_FORUM.'), MONTH('.self::DATE_FORUM.'), DAY('.self::DATE_FORUM.')';
    				break;
    			case 'enseignant':
    				$filtre = Enseignant::NOM_ENSEIGNANT;
    				break;
    			case 'etat':
    				$filtre = self::ETAT_FORUM;
    				break;
    			default:
    				$filtre = null;
    		}
    	}
    	
    	$CI->db	->select(self::ID_FORUM.','.self::ID_ADC_FORUM.','.self::TITRE_FORUM.','.self::COMMENTAIRE_FORUM.','.self::DATE_FORUM.','.self::LIEU_FORUM.','.self::NOM_LYCEE_FORUM.','.self::HEURE_DEBUT_FORUM.','.self::HEURE_FIN_FORUM.', f.'.self::LOGIN_ENSEIGNANT_FORUM.', e.'.Enseignant::NOM_ENSEIGNANT.', '.self::ETAT_FORUM.','.self::ID_ETUDIANT1_FORUM.','.self::ID_ETUDIANT2_FORUM.','.self::NOTE_MAX_FORUM)
				->from(self::TABLE_FORUM.' f')
				->join(Enseignant::TABLE_ENSEIGNANT.' e', 'f.'.self::LOGIN_ENSEIGNANT_FORUM.' = e.'.self::LOGIN_ENSEIGNANT_FORUM, 'left');
    	
    	if($idAction != null)
			$CI->db ->where(self::ID_ADC_FORUM, (int)$idAction);
    	if($where != null)
    		$CI->db->where($where);
    	if($filtre != null)
    		$CI->db->order_by($filtre, 'asc');   
    	 	 
    	$resultat = $CI->db->get()
    					   ->result_array();
    	
    	$forums = array();
    	 
    	if(!empty($resultat))
    	{
    		foreach($resultat as $r)
    		{
    			$forum = new Forum();
    			$forum->setId($r[self::ID_FORUM]);
    			$forum->setAction($resultat[0][self::ID_ADC_FORUM]);
    			$forum->setTitre($r[self::TITRE_FORUM]);
    			$forum->setCommentaire($r[self::COMMENTAIRE_FORUM]);
    			$forum->setDate($r[self::DATE_FORUM]);
    			$forum->setEnseignant($r[self::LOGIN_ENSEIGNANT_FORUM]);
    			$forum->setLieu($r[self::LIEU_FORUM]);
    			$forum->setEtat($r[self::ETAT_FORUM]);
    			$forum->setHeureDebut($r[self::HEURE_DEBUT_FORUM]);
    			$forum->setHeureFin($r[self::HEURE_FIN_FORUM]);
    			$forum->setNomLycee($r[self::NOM_LYCEE_FORUM]);
    			$forum->setEtudiant1($r[self::ID_ETUDIANT1_FORUM]);
    			$forum->setEtudiant2($r[self::ID_ETUDIANT2_FORUM]);
    			$forum->setNoteMax($resultat[0][self::NOTE_MAX_FORUM]);
    			 
    			$forums[] = $forum;
    		}
    	}
    	 
    	return $forums;
    }
    
    /**
     * Fonctions permettant de trouver tous les forums
     * @return array Un tableau de forum.
     */
    public static function findAllDate($date)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    		
    	if($date == date('Y-m-d'))
    		$resultat = $CI->db	->select(self::ID_FORUM.','.self::ID_ADC_FORUM.','.self::TITRE_FORUM.','.self::COMMENTAIRE_FORUM.','.self::DATE_FORUM.','.self::LIEU_FORUM.','.self::NOM_LYCEE_FORUM.','.self::HEURE_DEBUT_FORUM.','.self::HEURE_FIN_FORUM.','.self::LOGIN_ENSEIGNANT_FORUM.','.self::ETAT_FORUM.','.self::ID_ETUDIANT1_FORUM.','.self::ID_ETUDIANT2_FORUM)
					    		->from(self::TABLE_FORUM)
					    		->where(self::DATE_FORUM.' <= ADDDATE(NOW(),30)
										AND '.self::FORUM_ADC.' <> 4')
								->order_by('YEAR('.self::DATE_FORUM.'), MONTH('.self::DATE_FORUM.'), DAY('.self::DATE_FORUM.')', 'asc')
					    		->get()
					    		->result_array();
    	else
    		$resultat = $CI->db	->select(self::ID_FORUM.','.self::ID_ADC_FORUM.','.self::TITRE_FORUM.','.self::COMMENTAIRE_FORUM.','.self::DATE_FORUM.','.self::LIEU_FORUM.','.self::NOM_LYCEE_FORUM.','.self::HEURE_DEBUT_FORUM.','.self::HEURE_FIN_FORUM.','.self::LOGIN_ENSEIGNANT_FORUM.','.self::ETAT_FORUM.','.self::ID_ETUDIANT1_FORUM.','.self::ID_ETUDIANT2_FORUM)
					    		->from(self::TABLE_FORUM)
					    		->where(self::DATE_FORUM.' <= "'.$date.'"
										AND '.self::ETAT_FORUM.' <> 4')
								->order_by('YEAR('.self::DATE_FORUM.'), MONTH('.self::DATE_FORUM.'), DAY('.self::DATE_FORUM.')', 'asc')
    							->get()
    							->result_array();
    		
    
    	$forums = array();
    	 
    	if(!empty($resultat))
    	{
    		foreach($resultat as $r)
    		{
    			$forum = new Forum();
    			$forum->setId($r[self::ID_FORUM]);
    			$forum->setAction($resultat[0][self::ID_ADC_FORUM]);
    			$forum->setTitre($r[self::TITRE_FORUM]);
    			$forum->setCommentaire($r[self::COMMENTAIRE_FORUM]);
    			$forum->setDate($r[self::DATE_FORUM]);
    			$forum->setEnseignant($r[self::LOGIN_ENSEIGNANT_FORUM]);
    			$forum->setLieu($r[self::LIEU_FORUM]);
    			$forum->setEtat($r[self::ETAT_FORUM]);
    			$forum->setHeureDebut($r[self::HEURE_DEBUT_FORUM]);
    			$forum->setHeureFin($r[self::HEURE_FIN_FORUM]);
    			$forum->setNomLycee($r[self::NOM_LYCEE_FORUM]);
    			$forum->setEtudiant1($r[self::ID_ETUDIANT1_FORUM]);
    			$forum->setEtudiant2($r[self::ID_ETUDIANT2_FORUM]);
    			 
    			$forums[] = $forum;
    		}
    	}
    	 
    	return $forums;
    }
    
    /**
     * Fonction permettant de récupérer une action de communication en fonction de son identifiant
     * @param integer $id identifiant de l'action
     * @return ActionDeCommunication une action de communication
     */
    public static function findById($id)
    {
    	$CI = get_instance();
    	 
    	$CI->load->database('db_adc', true);
    	 
    	$resultat = $CI->db	->select(self::ID_FORUM.','.self::ID_ADC_FORUM.','.self::TITRE_FORUM.','.self::COMMENTAIRE_FORUM.','.self::DATE_FORUM.','.self::LIEU_FORUM.','.self::NOM_LYCEE_FORUM.','.self::HEURE_DEBUT_FORUM.','.self::HEURE_FIN_FORUM.','.self::LOGIN_ENSEIGNANT_FORUM.','.self::ETAT_FORUM.','.self::DATE_LIMITE_INSCRIPTION_FORUM.','.self::ETAT_FORUM.','.self::ID_ETUDIANT1_FORUM.','.self::ID_ETUDIANT2_FORUM.','.self::NOTE_MAX_FORUM.','.self::NOTE1_FORUM.','.self::NOTE2_FORUM)
					    	->from(Forum::TABLE_FORUM)
					    	->where(Forum::ID_FORUM, (int)$id)
					    	->limit(1)
					    	->get()
					    	->result_array();
    	 
    	if(!empty($resultat))
    	{
    		$forum = new Forum();
    		$forum->setId($resultat[0][self::ID_FORUM]);
    		$forum->setAction($resultat[0][self::ID_ADC_FORUM]);
    		$forum->setTitre($resultat[0][self::TITRE_FORUM]);
    		$forum->setCommentaire($resultat[0][self::COMMENTAIRE_FORUM]);
    		$forum->setDate($resultat[0][self::DATE_FORUM]);
    		$forum->setEnseignant($resultat[0][self::LOGIN_ENSEIGNANT_FORUM]);
    		$forum->setLieu($resultat[0][self::LIEU_FORUM]);
    		$forum->setEtat($resultat[0][self::ETAT_FORUM]);
    		$forum->setHeureDebut($resultat[0][self::HEURE_DEBUT_FORUM]);
    		$forum->setHeureFin($resultat[0][self::HEURE_FIN_FORUM]);
    		$forum->setNomLycee($resultat[0][self::NOM_LYCEE_FORUM]);
    		$forum->setDateLimiteInscription($resultat[0][self::DATE_LIMITE_INSCRIPTION_FORUM]);
    		$forum->setEtudiant1($resultat[0][self::ID_ETUDIANT1_FORUM]);
    		$forum->setEtudiant2($resultat[0][self::ID_ETUDIANT2_FORUM]);
    		$forum->setNoteMax($resultat[0][self::NOTE_MAX_FORUM]);
    		if(isset($resultat[0][self::NOTE1_FORUM]))
    			$forum->setNoteEtu1($resultat[0][self::NOTE1_FORUM]);
    		if(isset($resultat[0][self::NOTE2_FORUM]))
    			$forum->setNoteEtu2($resultat[0][self::NOTE2_FORUM]);
    		return $forum;
    	}
    	return false;
    }
    
    /**
     * Permet de compter le nombre de forums où l'étudiant est inscrit (pour les lundis de l'info).
     * @param int $idEtu Identifiant de l'étudiant susceptible de participer au forum
     * @return boolean true si l'étudiant participe à moins de 2 forums sinon false
     */
    public function nbEtuForum($idEtu)
    {
    	$CI = get_instance();
    	
    	$CI->load->database('db_adc', true);
    	 
    	$ok = $CI->db 	->where(self::ID_ADC_FORUM, $this->getAction()->getId())
    					->where(self::ID_ETUDIANT1_FORUM, $idEtu)
    					->or_where(self::ID_ETUDIANT2_FORUM, $idEtu)
    					->count_all_results(self::TABLE_FORUM);
    	
		if( $ok < 2)
    		return true;
    	else
    		return false;
    }
    
    /**
     * Permet de savoir si l'étudiant est inscrit à la liste d'attente du forum.
     * @param int $idEtu identifiant de l'etudiant
     * @return boolean true si l'étudiant est dans la liste d'attente sinon false
     */
    public function isAttenteForum($idEtu)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    	
    	$ok = $CI->db 	->where(array(AttenteForum::ID_FORUM_ATTENTE => $this->getId(),
				    		AttenteForum::ID_ETUDIANT_ATTENTE => $idEtu))
				    	->count_all_results(AttenteForum::TABLE_ATTENTE_FORUM);
    	if( $ok > 0)
    		return true;
    	else
    		return false;
    }
    
    /**
     * Permet de savoir si l'étudiant participe à un forum de l'Action de communication liée.
     * @param int $idEtu
     * @return boolean true si l'étudiant participe sinon false
     */
    public function isParticipeAllForum($idEtu)
    {
    	$CI = get_instance();
    	 
    	$CI->load->database('db_adc', true);
    	
    	$ok = $CI->db 	->where(self::ID_ADC_FORUM, $this->getAction()->getId())
    					->where(self::ID_ETUDIANT1_FORUM, $idEtu)
    					->or_where(self::ID_ETUDIANT2_FORUM, $idEtu)
    					->count_all_results(self::TABLE_FORUM);
    	if( $ok > 0)
    		return true;
    	else
    		return false;
    }
    
    /**
     * Permet de savoir si l'étudiant est inscrit à l'Action de communication liée au furum.
     * @param int $idEtu
     * @return boolean true si l'étudiant est inscrit à l'Action de communication sinon false
     */
    public function isParticipeADCGroupable($idADC, $idEtu)
    {
    	$CI = get_instance();
    	
    	$CI->load->database('db_adc', true);
    	 
    	$ok = $CI->db 	->where(array(Participe::ID_ACTION_PARTICIPE => $idADC,
    			Participe::ID_ETUDIANT_PARTICIPE => $idEtu))
    			->count_all_results(Participe::TABLE_PARTICIPE);
    	if( $ok > 0)
    		return true;
    	else
    		return false;
    }
    
    /**
     * Permet de savoir si l'étudiant participe à un forum terminé de l'Action de communication liée.
     * @param int $idEtu
     * @return boolean true si l'étudiant participe sinon false
     */
    public static function isParticipeAllForumTermine($idEtu)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    	 
    	$etat = $CI->db ->select(self::ETAT_FORUM)
    					->from(self::TABLE_FORUM)
				    	->where(self::ID_ETUDIANT1_FORUM, $idEtu)
				    	->or_where(self::ID_ETUDIANT2_FORUM, $idEtu)
    					->get()
    					->result_array();
    	
    	$ok=false;
    	
    	
    	
    	foreach($etat as $e)
    	{
    		if($e['CodeEtat'] == 4)
    			$ok=true;
    	}
    	
    	
    	return $ok;
    }
    
    /**
     * Permet d'inscrire un étudiant au forum
     * @param int $idEtu identifiant de l'etudiant
     */
    public function inscrireForum($idEtu)
    {     
    	if(is_null($this->getEtudiant1()) || $this->getEtudiant1()->getId()=="NULL")
    	{
           $CI = get_instance();
        
            $CI->load->database('db_adc', true); 

    		$CI->db->set(self::ID_ETUDIANT1_FORUM, (int)$idEtu)
					->where(self::ID_FORUM, (int)$this->getId())
    				->update(self::TABLE_FORUM);
    	}
    	elseif(is_null($this->getEtudiant2()) || $this->getEtudiant2()->getId()=="NULL")
    	{
             $CI = get_instance();
        
            $CI->load->database('db_adc', true); 

    		$CI->db->set(self::ID_ETUDIANT2_FORUM, (int)$idEtu)
    				->where(self::ID_FORUM, (int)$this->getId())
    				->update(self::TABLE_FORUM);
    	}
    	if(!is_null($this->getEtudiant1()) && !is_null($this->getEtudiant2()))
    	{
            $CI = get_instance();
        
            $CI->load->database('db_adc', true); 

    		$CI->db->set(self::ETAT_FORUM, 2)
    				->where(self::ID_FORUM, (int)$this->getId())
    				->update(self::TABLE_FORUM);
    	}
    	if(!self::isParticipeADCGroupable($this->getAction()->getId(), $idEtu))
    	{

            $CI = get_instance();
        
            $CI->load->database('db_adc', true); 
            
    		$CI->db->set(Participe::ID_ACTION_PARTICIPE, $this->getAction()->getId());
    		$CI->db->set(Participe::ID_ETUDIANT_PARTICIPE, $idEtu);
    		 
    		$CI->db->insert(Participe::TABLE_PARTICIPE);
    	}

    }
    
    /**
     * Permet de désinscrire un étudiant du forum
     * @param int $idEtu identifiant de l'etudiant
     */
    public function desinscrireForum($idEtu)
    {
    	if($this->getEtudiant1()->getId() == $idEtu)
    	{
    		$CI = get_instance();
    		$CI->load->database('db_adc', true);
    		$CI->db->set(self::ID_ETUDIANT1_FORUM, NULL)
    				->where(self::ID_FORUM, (int)$this->getId())
    				->update(self::TABLE_FORUM);
    	}
    	elseif($this->getEtudiant2()->getId() == $idEtu)
    	{
    		$CI = get_instance();
    		$CI->load->database('db_adc', true);
    		$CI->db->set(self::ID_ETUDIANT2_FORUM, NULL)
    				->where(self::ID_FORUM, (int)$this->getId())
    				->update(self::TABLE_FORUM);
    	}
    	$CI = get_instance();
    	$CI->load->database('db_adc', true);
    	$attente = (int) $CI->db->where(AttenteForum::ID_FORUM_ATTENTE, $this->getId())
    							->count_all_results(AttenteForum::TABLE_ATTENTE_FORUM);
    	if( $attente > 0)
    	{
    		$etu = $CI->db	->select(AttenteForum::ID_ETUDIANT_ATTENTE)
    						->from(AttenteForum::TABLE_ATTENTE_FORUM)
    						->where(array(AttenteForum::ID_FORUM_ATTENTE => $this->getId(),
    									AttenteForum::RANG_ATTENTE => 1))
    						->get()
    						->result_array();
    		$this->setEtudiant2(NULL);
    		$this->inscrireForum($etu[0][AttenteForum::ID_ETUDIANT_ATTENTE]);
    		$this->desinscrireAttenteForum($etu[0][AttenteForum::ID_ETUDIANT_ATTENTE]);
    	}
    	else
    	{
    		$CI->db->set(self::ETAT_FORUM, 1)
    				->where(self::ID_FORUM, (int)$this->getId())
    				->update(self::TABLE_FORUM);
    	}
    	if(!$this->isParticipeAllForum($idEtu) && $this->getAction()->getTitre()!=self::LUNDI && $this->getAction()->getTitre()!=self::LUNDI2)
    	{
    		$CI->db->where(array(Participe::ID_ACTION_PARTICIPE => $this->getAction()->getId(),
    							Participe::ID_ETUDIANT_PARTICIPE => $idEtu))
    				->delete(Participe::TABLE_PARTICIPE);
    	}
    }
    
    /**
     * Permet d'inscrire un étudiant en liste d'attente du forum
     * @param int $idEtu identifiant de l'etudiant
     */
    public function inscrireAttenteForum($idEtu)
    {
    	$CI = get_instance();
    	 
    	$CI->load->database('db_adc', true);
    	 
    	$rang = $CI->db	->select_max(AttenteForum::RANG_ATTENTE)
				    	->from(AttenteForum::TABLE_ATTENTE_FORUM)
				    	->where(AttenteForum::ID_FORUM_ATTENTE, $this->getId())
				    	->get()
				    	->result_array();
    	if(is_null($rang[0][AttenteForum::RANG_ATTENTE]))
    		$r = 1;
    	else
    		$r = $rang[0][AttenteForum::RANG_ATTENTE] + 1;
    	
    	$CI->db->set(AttenteForum::ID_FORUM_ATTENTE, $this->getId());
    	$CI->db->set(AttenteForum::ID_ETUDIANT_ATTENTE, $idEtu);
    	$CI->db->set(AttenteForum::RANG_ATTENTE, $r);
    	 
    	$CI->db->insert(AttenteForum::TABLE_ATTENTE_FORUM);
    }
    
    /**
     * Permet de récupérer le rang d'un étudiant en liste d'attente d'un forum
     * @param int $id identifiant du forum
     * @param int $idEtu identifiant de l'etudiant
     * @return int
     */
    public function rangAttenteForum($idEtu)
    {
    	$CI = get_instance();
    	 
    	$CI->load->database('db_adc', true);
    	 
    	$rang = $CI->db	->select(AttenteForum::RANG_ATTENTE)
				    	->from(AttenteForum::TABLE_ATTENTE_FORUM)
				    	->where(array(AttenteForum::ID_FORUM_ATTENTE => $this->getId(),
				    			AttenteForum::ID_ETUDIANT_ATTENTE => $idEtu))
		    			->get()
		    			->result_array();
    	
    	return $rang[0][AttenteForum::RANG_ATTENTE];
    }
    
    /**
     * Permet de désinscrire un étudiant de la liste d'attente du forum
     * @param int $idEtu identifiant de l'etudiant
     */
    public function desinscrireAttenteForum($idEtu)
    {
    	$CI = get_instance();
    	 
    	$CI->load->database('db_adc', true);
    	 
    	$rang = $this->rangAttenteForum($idEtu);
    	
    	$CI->db->where(array(AttenteForum::ID_FORUM_ATTENTE => $this->getId(),
    			AttenteForum::ID_ETUDIANT_ATTENTE => $idEtu))
    			->delete(AttenteForum::TABLE_ATTENTE_FORUM);
    	 
    	$CI->db->set(AttenteForum::RANG_ATTENTE, AttenteForum::RANG_ATTENTE.' -1', FALSE);
    	$CI->db->where(AttenteForum::ID_FORUM_ATTENTE.' = '.(int)$this->getId().'
    			AND '.AttenteForum::RANG_ATTENTE.' > '.$rang);
    	$CI->db->update(AttenteForum::TABLE_ATTENTE_FORUM);
    }
    
    /**
     * Permet d'ajouter un professeur au forum
     * @param string $loginProf
     */
    public function inscrireEnseignantForum($loginProf)
    {
    	$CI = get_instance();
    	 
    	$CI->load->database('db_adc', true);

    	 $CI->db->set(self::LOGIN_ENSEIGNANT_FORUM, $loginProf)
				->where(self::ID_FORUM, (int)$this->getId())
    			->update(self::TABLE_FORUM);
    }
    
    /**
     * Fonction permettant d'ajouter un forum
     * @param int $idADC id de l'action liée
     * @param string $titre titre du forum
     * @param string $commentaire commentaire du forum
     * @param date $date date du forum
     * @param date $dateLimite date limite d'inscription au forum
     * @param string $lieu lieu de déroulement du forum
     * @param string $lycee nom du lycée où se déroule le forum
     * @param DateTime $heureDebut heure de début du forum
     * @param DateTime $heureFin heure de fin du forum
     * @param float $noteMax note maximale du forum
     * @param int $loginEnseignant login de l'enseignant chargé du forum
     * @param int $idEtat id de l'etat du forum
     * @return true ou false
     */
    public static function addForum($idADC, $titre, $commentaire, $date, $dateLimite, $lieu, $lycee, $heureDeb, $heureFin, $noteMax, $loginEnseignant, $idEtat)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    	 
    	if($commentaire != null)
    		$CI->db->set(self::COMMENTAIRE_FORUM, $commentaire);
    	 
    	if($date != null)
    		$CI->db->set(self::DATE_FORUM, putDateAAAAMMJJ($date));
    	 
    	if($dateLimite != null)
    		$CI->db->set(self::DATE_LIMITE_INSCRIPTION_FORUM, putDateAAAAMMJJ($dateLimite));
    	 
    	if($lycee != null)
    		$CI->db->set(self::NOM_LYCEE_FORUM, $lycee);
    	
    	if($heureDeb != null)
    		$CI->db->set(self::HEURE_DEBUT_FORUM, $heureDeb);
    	
    	if($heureFin != null)
    		$CI->db->set(self::HEURE_FIN_FORUM, $heureFin);
    	
    	if($noteMax != null)
    		$CI->db->set(self::NOTE_MAX_FORUM, $noteMax);
    	 
    	if($loginEnseignant != null)
    		$CI->db->set(self::LOGIN_ENSEIGNANT_FORUM, $loginEnseignant);
    	 
    	$CI->db->set(self::ID_ADC_FORUM, $idADC);
    	$CI->db->set(self::TITRE_FORUM, $titre);
    	$CI->db->set(self::LIEU_FORUM, $lieu);
    	$CI->db->set(self::ETAT_FORUM, $idEtat);
    	 
    
    	return $CI->db->insert(self::TABLE_FORUM);
    }
    
    /**
     * Fonction permettant de modifier une action
     * @param string $titre titre du forum
     * @param string $commentaire commentaire du forum
     * @param date $date date du forum
     * @param date $dateLimite date limite d'inscription au forum
     * @param string $lieu lieu de déroulement du forum
     * @param string $lycee nom du lycée où se déroule le forum
     * @param DateTime $heureDebut heure de début du forum
     * @param DateTime $heureFin heure de fin du forum
     * @param float $noteMax note maximale du forum
     * @param int $loginEnseignant login de l'enseignant chargé du forum
     * @param int $idEtat id de l'etat du forum
     * @return true ou false
     */
    public function modifyForum($titre, $commentaire, $date, $dateLimite, $lieu, $lycee, $heureDeb, $heureFin, $noteMax, $loginEnseignant, $idEtat)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    	 
    	if($commentaire != null)
    		$CI->db->set(self::COMMENTAIRE_FORUM, $commentaire);
    	else
    		$CI->db->set(self::COMMENTAIRE_FORUM, null);
    	 
    	if($date != null)
    		$CI->db->set(self::DATE_FORUM, putDateAAAAMMJJ($date));
    	else
    		$CI->db->set(self::DATE_FORUM, null);
    	 
    	if($dateLimite != null)
    		$CI->db->set(self::DATE_LIMITE_INSCRIPTION_FORUM, putDateAAAAMMJJ($dateLimite));
    	else
    		$CI->db->set(self::DATE_LIMITE_INSCRIPTION_FORUM, null);    	
    	 
    	if($lycee != null)
    		$CI->db->set(self::NOM_LYCEE_FORUM, $lycee);
    	else
    		$CI->db->set(self::NOM_LYCEE_FORUM, null);
    	
    	if($heureDeb != null)
    		$CI->db->set(self::HEURE_DEBUT_FORUM, $heureDeb);
    	else
    		$CI->db->set(self::HEURE_DEBUT_FORUM, null);
    	
    	if($heureFin != null)
    		$CI->db->set(self::HEURE_FIN_FORUM, $heureFin);
    	else
    		$CI->db->set(self::HEURE_FIN_FORUM, null);
    	
    	if($noteMax != null)
    		$CI->db->set(self::NOTE_MAX_FORUM, $noteMax);
    	else
    		$CI->db->set(self::NOTE_MAX_FORUM, null);
    	 
    	if($loginEnseignant != null)
    		$CI->db->set(self::LOGIN_ENSEIGNANT_FORUM, $loginEnseignant);
    	else
    		$CI->db->set(self::LOGIN_ENSEIGNANT_FORUM, null);
    	 
    	$CI->db->set(self::TITRE_FORUM, $titre);
    	$CI->db->set(self::LIEU_FORUM, $lieu);
    	$CI->db->set(self::ETAT_FORUM, $idEtat);
    
    	$CI->db->where(self::ID_FORUM, (int)$this->getId());
    
    	return $CI->db->update(self::TABLE_FORUM);
    }
    
    /**
     * Fonction permettant de modifier l'etat d'un forum
     * @param int $idEtat id de l'etat du forum
     * @return true ou false
     */
    public function modifyEtatForum($idEtat)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    
    	$CI->db->set(self::ETAT_FORUM, (int)$idEtat);
    
    	$CI->db->where(self::ID_FORUM, (int)$this->getId());
    
    	return $CI->db->update(self::TABLE_FORUM);
    }
    
    /**
     * Fonction permettant de supprimer un forum
     * @return true ou false
     */
    public function delForum()
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    
    	return $CI->db->where(self::ID_FORUM, (int)$this->getId())
    	->delete(self::TABLE_FORUM);
    }
    
    /**
     * Fonction pour modifier les notes
     * @param float $note1
     * @param float $note2
     */
    public function modifyNote($note1, $note2)
    {
    	$CI = get_instance();
    
    	$CI->load->database('db_adc', true);
    
    	$CI->db->set(self::NOTE1_FORUM, $note1);
    	$CI->db->set(self::NOTE2_FORUM, $note2);
    
    	$CI->db->where(self::ID_FORUM, (int)$this->getId());
    
    	return $CI->db->update(self::TABLE_FORUM);
    }
    
    
    /**
     * Permet de vérifier le formulaire de création et modification d'un forum
     * @param int $id id de l'action groupable
     * @param string $titre titre du forum
     * @param string $commentaire commentaire du forum
     * @param date $date date du forum
     * @param date $dateLimite date limite d'inscription au forum
     * @param string $lieu lieu de déroulement du forum
     * @param string $lycee nom du lycée où se déroule le forum
     * @param DateTime $heureDebut heure de début du forum
     * @param DateTime $heureFin heure de fin du forum
     * @param float $noteMax note maximale du forum
     * @param int $loginEnseignant login de l'enseignant chargé du forum
     * @return boolean
     */
    public function check($id, $titre, $date, $dateLimite, $lieu, $heureDeb, $heureFin, $ptMax, $enseignant)
    {
    	$CI =& get_instance();
    	$message = '';
    	$retour = true;
    
    	if($date != null)
    	{
    		if(!verif($date, 'date'))
    		{
    			$message .= "<br>Format de la date de déroulement incorrecte, elle doit être de la forme jj/mm/aaaa.";
    			$retour = false;
    		}
    
    	}
    	if($dateLimite != null) // verifie le format de la date limite
    		{
    			if(!verif($dateLimite, 'date'))
    			{
    				$message .= "<br>Format de la date limite incorrecte, elle doit être de la forme jj/mm/aaaa.";
    				$retour = false;
    			}
    		}
    
    	if($titre == null || $lieu == null)
    	{
    		$message .= "<br>Vous devez remplir tout les champs obligatoires.";
    		$CI->session->set_flashdata('message', $message);
    		return false;
    	}
    	else
    	{
    		if($date != null && verif($date, 'date'))
    		{
    			if(isLater(date("d/m/Y"), $date) != 1)
    			{
    				$message .= "<br>La date de déroulement doit être supérieur à celle du jour.";
    				$retour = false;
    			}
    	
    			if($dateLimite != null && verif($dateLimite, 'date'))
    			{
    				if(isLater(date("d/m/Y"), $dateLimite) != 1)
    				{
    					$message .= "<br>La date limite entrée doit être supérieur à celle du jour.";
    					$retour = false;
    				}
    				if(isLater($dateLimite, $date) != 1)
    				{
    					$message .= "<br>La date limite entrée doit être antérieure à la date de déroulement.";
    					$retour = false;
    				}
    			}	
    		}
    		if($dateLimite != null && $date == null)
    		{
    			$message .= "<br>Vous devez entrez une date de déroulement pour indiquer une date limite.";
    			$retour = false;
    		}
    		if($ptMax != null && $ptMax < 0)
    		{
    			$message .= "<br>La note maximum doit être supérieur à 0.";
    			$retour = false;
    		}
    		if($enseignant != null)
    		{
    			$enseignants = Enseignant::findAll();
    			$enseignantOk = false;
    			foreach($enseignants as $ens)
    			{
    				if($ens->getLogin() == $enseignant)
    					$enseignantOk = true;
    			}
    			if(!$enseignantOk)
    			{
    				$message .= "<br>Login de l'enseignant incorrect.";
    				$retour = false;
    			}
    		}
    		if($heureDeb != null && !verif($heureDeb, 'time'))
    		{
    			$message .= "<br>Format de l'heure de début incorrect, elle doit être de la forme hh:mm.";
    			$retour = false;
    		}
    		if($heureFin != null && !verif($heureFin, 'time'))
    		{
    			$message .= "<br>Format de l'heure de fin incorrect, elle doit être de la forme hh:mm.";
    			$retour = false;
    		}
    		if($heureDeb != null && $heureFin != null && verif($heureDeb, 'time') && verif($heureFin, 'time'))
    		{
    			if(isLaterTime($heureDeb, $heureFin) != 1)
    			{
    				$message .= "<br>L'heure de fin doit être après l'heure de début.";
    				$retour = false;
    			}
    		}
    		$action = ActionDeCommunication::findById($id);
    		if($action == false)
    		{
    			$message .= "<br>L'id de l'action est incorrect.";
    			$retour = false;
    		}  		
    		elseif($action->getGroupable() == 0 && ($action->getTitre() != self::LUNDI || $action->getTitre()!=self::LUNDI2))
    		{
    			$message .= "<br>L'id de l'action est incorrect.";
    			$retour = false;
    		}
    		$CI->session->set_flashdata('message', $message);
    		return $retour;
    	}
    }
    
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    
    /**
     * Set id
     *
     * @param integer $id
     * @return integer
     */
    public function setId($id)
    {
    	$this->id = $id;
    }

    /**
     * Set titre
     *
     * @param string $titre
     * @return Forum
     */
    public function setTitre($titre)
    {
        $this->titre = $titre;
    }

    /**
     * Get titre
     *
     * @return string 
     */
    public function getTitre()
    {
        return $this->titre;
    }

    /**
     * Set commentaire
     *
     * @param string $commentaire
     * @return Forum
     */
    public function setCommentaire($commentaire)
    {
        $this->commentaire = $commentaire;
    }

    /**
     * Get commentaire
     *
     * @return string 
     */
    public function getCommentaire()
    {
        return $this->commentaire;
    }

    /**
     * Set date
     *
     * @param string $date
     * @return Forum
     */
    public function setDate($date)
    {
        $this->date = $date;
    }

    /**
     * Get date
     *
     * @return string 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set dateLimiteInscription
     *
     * @param string $dateLimiteInscription
     * @return Forum
     */
    public function setDateLimiteInscription($dateLimiteInscription)
    {
        $this->dateLimiteInscription = $dateLimiteInscription;
    }

    /**
     * Get dateLimiteInscription
     *
     * @return string
     */
    public function getDateLimiteInscription()
    {
        return $this->dateLimiteInscription;
    }

    /**
     * Set lieu
     *
     * @param string $lieu
     * @return Forum
     */
    public function setLieu($lieu)
    {
        $this->lieu = $lieu;
    }

    /**
     * Get lieu
     *
     * @return string 
     */
    public function getLieu()
    {
        return $this->lieu;
    }

    /**
     * Set nomLycee
     *
     * @param string $nomLycee
     * @return Forum
     */
    public function setNomLycee($nomLycee)
    {
        $this->nomLycee = $nomLycee;
    }

    /**
     * Get nomLycee
     *
     * @return string 
     */
    public function getNomLycee()
    {
        return $this->nomLycee;
    }

    /**
     * Set heureDebut
     *
     * @param string $heureDebut
     * @return Forum
     */
    public function setHeureDebut($heureDebut)
    {
        $this->heureDebut = $heureDebut;
    }

    /**
     * Get heureDebut
     *
     * @return string 
     */
    public function getHeureDebut()
    {
        return $this->heureDebut;
    }

    /**
     * Set heureFin
     *
     * @param string $heureFin
     * @return Forum
     */
    public function setHeureFin($heureFin)
    {
        $this->heureFin = $heureFin;
    }

    /**
     * Get heureFin
     *
     * @return string 
     */
    public function getHeureFin()
    {
        return $this->heureFin;
    }

    /**
     * Set noteMax
     *
     * @param integer $noteMax
     * @return Forum
     */
    public function setNoteMax($noteMax)
    {
        $this->noteMax = $noteMax;
    }

    /**
     * Get noteMax
     *
     * @return integer 
     */
    public function getNoteMax()
    {
        return $this->noteMax;
    }

    /**
     * Set action
     *
     * @param integer $id l'ID de l'action
     * @return Forum
     */
    public function setAction($id = null)
    {
        $this->action = $id;
    }

    /**
     * Get action
     *
     * @return ActionDeCommunication 
     */
    public function getAction()
    {
//     		exit(print_r(ActionDeCommunicationRepository::findById($this->action)));
    	
        return ActionDeCommunication::findById($this->action);
    }

    /**
     * Set etat
     *
     * @param integer $id ID de l'etat
     * @return ActionDeCommunication
     */
    public function setEtat($id = null)
    {
        $this->etat = $id;
    }

    /**
     * Get etat
     *
     * @return Etat 
     */
    public function getEtat()
    {
 		$this->load->database('db_adc', true);
    	$resultat = $this->db	->select(Etat::LIBELLE_ETAT.', '.Etat::ID_ETAT)
						    	->from(Etat::TABLE_ETAT)
						    	->where(Etat::ID_ETAT, $this->etat)
						    	->limit(1)
						    	->get()
						    	->result_array();
    	if(!empty($resultat))
    	{
	    	$etat = new Etat();
	    	$etat->setId($resultat[0][Etat::ID_ETAT]);
	    	$etat->setLibelle($resultat[0][Etat::LIBELLE_ETAT]);
	    	
	    	return $etat;
    	}
    	return '';    
    }

    /**
     * Set etudiant1
     *
     * @param string $login Le login de l'étudiant
     * @return Forum
     */
    public function setEtudiant1($id)
    {
        $this->etudiant1 = $id;
    }

    /**
     * Get etudiant1
     *
     * @return Etudiants 
     */
    public function getEtudiant1()
    {
    	if(!empty($this->etudiant1))
    		return Etudiants::findById($this->etudiant1);
    	else 
    		return null;
    }
    
    /**
     * Set etudiant2
     *
     * @param string $login Le login de l'étudiant
     * @return Forum
     */
    public function setEtudiant2($id)
    {
    	$this->etudiant2 = $id;
    }
    
    /**
     * Get etudiant2
     *
     * @return Etudiants
     */
    public function getEtudiant2()
    {
    	if(!empty($this->etudiant2))
    		return Etudiants::findById($this->etudiant2);
    	else 
    		return null;
    }
    
    /**
     * Set noteEtu1
     *
     * @param integer $noteEtu1
     * @return Forum
     */
    public function setNoteEtu1($noteEtu1)
    {
        $this->noteEtu1 = $noteEtu1;
    }

    /**
     * Get noteEtu1
     *
     * @return integer 
     */
    public function getNoteEtu1()
    {
        return $this->noteEtu1;
    }

    /**
     * Set noteEtu2
     *
     * @param integer $noteEtu2
     * @return Forum
     */
    public function setNoteEtu2($noteEtu2)
    {
        $this->noteEtu2 = $noteEtu2;
    }

    /**
     * Get noteEtu2
     *
     * @return integer 
     */
    public function getNoteEtu2()
    {
        return $this->noteEtu2;
    }

    /**
     * Set enseignant
     *
     * @param String $login Le login de l'enseignant
     * @return ActionDeCommunication
     */
    public function setEnseignant($enseignant = null)
    {
        $this->enseignant = $enseignant;
    }

    /**
     * Get enseignant
     *
     * @return Enseignant 
     */
    public function getEnseignant()
    {
    	if($this->enseignant != null)
    	{
        	$this->load->database('db_adc', true);
	    	$resultat = $this->db	->select(Enseignant::LOGIN_ENSEIGNANT.', '.Enseignant::NOM_ENSEIGNANT.', '.Enseignant::PRENOM_ENSEIGNANT.', '.Enseignant::MAIL_ENSEIGNANT)
							    	->from(Enseignant::TABLE_ENSEIGNANT)
							    	->where(Enseignant::LOGIN_ENSEIGNANT, $this->enseignant)
							    	->limit(1)
							    	->get()
							    	->result_array();
	    	
	    	if(!empty($resultat))
	    	{
		    	$enseignant = new Enseignant();
		    	$enseignant->setLogin($resultat[0][Enseignant::LOGIN_ENSEIGNANT]);
		    	$enseignant->setNom($resultat[0][Enseignant::NOM_ENSEIGNANT]);
		    	$enseignant->setPrenom($resultat[0][Enseignant::PRENOM_ENSEIGNANT]);
		    	$enseignant->setMail($resultat[0][Enseignant::MAIL_ENSEIGNANT]);
	    		
		    	return $enseignant;
	    	}
	    	
	    	return '';
    	}
    	else
    		return null;
    }
    
    /**
     * Fonctions permettant de retrouner la bonne condition WHERE*
     * @param String $where where voulu
     * @return la condition WHERE
     */
    public static function findWhere($where)
    {
    	$whr = '';
    	switch($where)
    	{
    		case 'WHERE_ALL':
    			$whr = self::TITRE_FORUM.' <> "'.self::LUNDI.'"
    					AND '.self::TITRE_FORUM.' <> "'.self::LUNDI2.'"';
    			break;
    		case 'WHERE_INC':
    			$whr = self::TITRE_FORUM.' <> "'.self::LUNDI.'"
    				AND '.self::TITRE_FORUM.' <> "'.self::LUNDI2.'"
					   AND ('.self::DATE_FORUM.' IS NULL
					   OR '.self::NOTE_MAX_FORUM.' IS NULL
					   OR e.'.self::LOGIN_ENSEIGNANT_FORUM.' IS NULL
    				   OR '.self::HEURE_DEBUT_FORUM.' IS NULL
    				   OR '.self::HEURE_FIN_FORUM.' IS NULL)';
    			break;
    		case 'WHERE_OUV':
    			$whr = self::TITRE_FORUM.' <> "'.self::LUNDI.'"
						AND '.self::TITRE_FORUM.' <> "'.self::LUNDI2.'"
    					AND '.self::ETAT_FORUM.' = 1';
    			break;
    		case 'WHERE_COM':
    			$whr = self::TITRE_FORUM.' <> "'.self::LUNDI.'"
    					AND '.self::TITRE_FORUM.' <> "'.self::LUNDI2.'"
						AND '.self::ETAT_FORUM.' = 2';
    			break;
    		case 'WHERE_CLO':
    			$whr = self::TITRE_FORUM.' <> "'.self::LUNDI.'"
    					AND '.self::TITRE_FORUM.' <> "'.self::LUNDI2.'"
						AND '.self::ETAT_FORUM.' = 3';
    			break;
    		case 'WHERE_TER':
    			$whr = self::TITRE_FORUM.' <> "'.self::LUNDI.'"
    					AND '.self::TITRE_FORUM.' <> "'.self::LUNDI2.'"
						AND '.self::ETAT_FORUM.' = 5';
    			break;
    		case 'WHERE_NOT':
    			$whr = self::TITRE_FORUM.' <> "'.self::LUNDI.'"
    				AND '.self::TITRE_FORUM.' <> "'.self::LUNDI2.'"
					AND '.self::ETAT_FORUM.' = 4';
    			break;
    		default:
    			exit("erreur");
    	}
    	 
    	return $whr;
    }
    
public function getCode()
	{
		$this->load->database('db_adc', true);
		$numero = $this->db	->query('
									SELECT COUNT( * )
									FROM '.self::TABLE_FORUM.'
									WHERE '.self::ID_FORUM.' <= '.$this->getId().'
									ORDER BY '.self::ID_FORUM.' ASC
				')
				
		;

		$numero->row_array();
		
		switch($this->getTheme()->getLibelle())
		{
			case 'FORUM':
				return 'A'.$numero->result_array[0]['COUNT( * )'];
				break;
			case 'DPT INFO':
				return 'B'.$numero->result_array[0]['COUNT( * )'];
				break;
			case 'BDE ODIN':
				return 'C'.$numero->result_array[0]['COUNT( * )'];
				break;
			default:
				return 'D'.$numero->result_array[0]['COUNT( * )'];
				break;
		}
	}
}
